package projeto1;

import classesControladoras.*;
import classesControladoras.exceptions.PreexistingEntityException;
import classesEntidades.*;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Lucas
 */

/*Classe cliente que contem os metodos para busca e extracao de dados a partir de uma pagina HTML e popular o banco de dados a partir dos dados obtidos
*/
public class Client {
    private final static String CHARSET = "iso-8859-1";
    private static final int ANO_MUDANCA_FORMATO_CATALOGO = 2012;

    
    
    /**
     * Escreve o conteudo de uma pagina html para um arquivo html 
     * @param url url da pagina
     * @param file arquivo em que o conteudo da pagina sera escrito
     * @throws IOException 
     */
    public void recebePagina(URL url, File file) throws IOException {
        BufferedReader in =
                new BufferedReader(new InputStreamReader(url.openStream(), CHARSET));
 
         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), CHARSET));
 
        String inputLine;
 
        while ((inputLine = in.readLine()) != null) {
            // Grava pagina no arquivo
            out.write(inputLine);
            out.newLine();
        }
 
        in.close();
        out.flush();
        out.close();
    }
    
    /**
     * A partir dos parametros de entrada do sistema, realiza uma serie de operacoes que populam o banco de dados.
     * @param catalogo ano de catalogo do curso que deseja ser inserido no banco
     * @param codCurso  codigo do curso que deseja ser inserido no banco
     */
    public void geraSaida(String catalogo, String codCurso) {
        URL url;
        
        int cat_val = Integer.parseInt(catalogo);
        int cod_val = Integer.parseInt(codCurso);
        StringBuilder urlStr = new StringBuilder();
        File file = new File("temp.html");

        try {
            /* diferenciacao de urls*/
            if(Integer.parseInt(catalogo)<ANO_MUDANCA_FORMATO_CATALOGO){
                if(codCurso.length()<2){
                    codCurso = "0".concat(codCurso);
                }
                urlStr.append("http://www.dac.unicamp.br/sistemas/catalogos/grad/catalogo");
                urlStr.append(catalogo);
                urlStr.append("/cursos/cpl");
                urlStr.append(codCurso);
                urlStr.append(".html");
                url = new URL(urlStr.toString());
                new Client().recebePagina(url, file);
                new LeitorHtml().lerHtml(catalogo, codCurso);
                new LeitorTxt().lerTxt(catalogo, codCurso);
            }else if(Integer.parseInt(catalogo)>=ANO_MUDANCA_FORMATO_CATALOGO){
                urlStr.append("http://www.dac.unicamp.br/sistemas/catalogos/grad/catalogo");
                urlStr.append(catalogo);
                urlStr.append("/curriculoPleno/cp");
                urlStr.append(codCurso);
                urlStr.append(".html");
                url = new URL(urlStr.toString());
                new Client().recebePagina(url, file);
                new LeitorHtml().lerHtml(catalogo, codCurso);
                new LeitorTxt().lerTxt(catalogo, codCurso);
            }
        } catch (FileNotFoundException e) {
            //TODO retorno pela interface
            System.out.println("Entrada Inválida");   
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * Insere no banco o curso agrupado com o curriculo que foi obtido da busca ao site da dac.
     * @param nome Nome do curso inserido
     * @param codigo Codigo do curso inserido
     * @param nomeModalidade Nome da Modalidade Inserida
     * @param codModalidade Codigo da modalidade Inserida
     * @param anoCatalogo Ano do catálogo inserido
     * @return Id do curriculo inserido no banco
     */
    
    //TODO modificar o banco para facilitar a busca por nome, basicamente modificar a chave primaria para valores mais acessiveis
    public int populaCursoCurriculo(String nome, String codigo, String nomeModalidade, String codModalidade, String anoCatalogo){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("projeto1PU");
        CursocurriculoJpaController daoCursoCurriculo = new CursocurriculoJpaController(emf);
        int idCursocurriculo;

        
        try{
            idCursocurriculo = daoCursoCurriculo.getCursocurriculoCount()+1;
        }
        catch(Exception e){
            idCursocurriculo = 1;
        }

        
        
        try{
            Cursocurriculo cursocurriculo;
            CursocurriculoPK cursocurriculopk;
            
            cursocurriculopk = new CursocurriculoPK(nome,codigo,nomeModalidade,codModalidade,anoCatalogo);
            cursocurriculo = new Cursocurriculo(cursocurriculopk, idCursocurriculo);
            try{
            daoCursoCurriculo.create(cursocurriculo);
            }
            catch(PreexistingEntityException e){
                
            }
        }catch(Exception e){
            
        }
  
        
        return idCursocurriculo;
        
    }



    /**
     * Insere no banco uma disciplina.
     * @param nome Nome da disciplina a ser inserida.
     * @param codigo Codigo da disciplina a ser inserida.
     * @return 
     */
    public int populaDisciplina(String nome, String codigo){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("projeto1PU");
        DisciplinaJpaController daoDisciplina = new DisciplinaJpaController(emf);
        int idDisciplina;
        
        try{
            idDisciplina = daoDisciplina.getDisciplinaCount()+1;
        }
        catch(Exception e){
            idDisciplina = 1;
        }
        
        try{
        Disciplina disciplina;
        disciplina = new Disciplina(codigo, idDisciplina, nome);
        daoDisciplina.create(disciplina);
        }catch(PreexistingEntityException e){
            
        }catch(Exception e){
            
        }
        return idDisciplina;
    }
    

    /**
     * Insere um objeto do tipo disciplina curriculo, que representa a relacao entre disciplina e curriculo, no banco.
     * @param idCurriculo Id do curriculo
     * @param idDisciplina Id da disciplina
     * @param tipoRelacao Tipo de relação (pode ser do curriculo pleno, eletiva, etc)
     * @param idGrupoEletiva Id do grupo de eletiva para aquele curriculo
     */
    public void populaDisciplinaCurriculo(String idCurriculo, String idDisciplina, String tipoRelacao, String idGrupoEletiva){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("projeto1PU");
        DisciplinacurriculoJpaController daoDisciplinaCurriculo = new DisciplinacurriculoJpaController(emf);
        int idDc;
        
        try{
            idDc = daoDisciplinaCurriculo.getDisciplinacurriculoCount()+1;
        }
        catch(Exception e){
            idDc = 1;
        }

        
        
        try{
            Disciplinacurriculo dc;
            DisciplinacurriculoPK dcpk;
            
            dcpk = new DisciplinacurriculoPK(Integer.parseInt(idCurriculo),Integer.parseInt(idDisciplina),tipoRelacao);
            dc = new Disciplinacurriculo(dcpk, idDc, Integer.parseInt(idGrupoEletiva)); 
            try{
            daoDisciplinaCurriculo.create(dc);
            }
            catch(PreexistingEntityException e){
                
            }
        }catch(Exception e){
            
        }
        
    }
    /**
     * Insere no banco um grupo de eletivas
     * @param numCreditos Quantidade de créditos atribuida aquele grupo de eletivas
     * @return Id do grupo de eletivas
     */
    //TODO
    public int populaGrupoEletiva(String numCreditos){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("projeto1PU");
        GrupoeletivasJpaController daoGrupoEletiva = new GrupoeletivasJpaController(emf);
        int idGrupoEletiva;
        
        try{
            idGrupoEletiva = daoGrupoEletiva.getGrupoeletivasCount()+1;
        }
        catch(Exception e){
            idGrupoEletiva = 1;
        }
        
        try{
        Grupoeletivas grupoeletivas;
        grupoeletivas = new Grupoeletivas(idGrupoEletiva);
        if(!numCreditos.isEmpty()){
            grupoeletivas.setNumcreditos(Integer.parseInt(numCreditos));
        }
        daoGrupoEletiva.create(grupoeletivas);
        }catch(PreexistingEntityException e){
            
        }catch(Exception e){
            
        }
        return idGrupoEletiva;
    }
}
